home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Bavarian
/
Bavarian #056 (19xx)(APS Electronic).zip
/
Bavarian #056 (19xx)(APS Electronic).adf
/
Anleitung
< prev
next >
Wrap
Text File
|
1987-05-04
|
43KB
|
846 lines
/**************************************************************************/
* *
* DIESES FILE IST NICHT TEIL DES ORIGINAL DBW_RENDER-PROGRAMMS *
* ~~~~~ *
* es wurde im September 1987 von mir hinzugefügt *
* es beansprucht KEINERLEI Rechte ! *
* *
* Für Details über die Rechte an DBW_Render lest bitte das *
* File COPYING ! *
* *
/**************************************************************************/
********** ***********
****** Anleitung zum Ray-Tracer DBW_RENDER von D.B.WECKER *******
********** ***********
************************************************************************
INHALT:
~~~~~~~
Einleitung
Weiterentwicklungen
Hintergrund-Infos
RAY
RAY2
DISPLAY
Schreiben eines .DAT-Files
Quellcode-Infos
EINLEITUNG:
~~~~~~~~~~~
Wer die schon früher erschienenen Ray-Tracing Bilder mag, wird
DBW_Render lieben. Dieses Paket ist eine KOMPLETTE übertragung des
Ray-Tracers,den der Autor auf einer VAX benutzte, um solche Bilder zu
erstellen.(it's really phantastic!!!).
Er läuft auf einem Standard-Amiga mit 512k Ram (und kann, wenn nötig,
für 256k umgestellt werden). Durch die Hinzufügung von AI-heuristics(??)
wird die Rechenzeit in die Größenordnung einer VAX-780 gerückt (auch wenn
der Amiga weder Fliesskomma-Prozessor noch virtuellen Speicher besitzt)!
Ohne AI-heuristics benötigt z.B. das Bild 'glass' auf einem Amiga 50 Std.
Mit den Heuristics sind es - bei voller Auflösung - nur 11 Stunden!
INHALT DES PAKETS:
~~~~~~~~~~~~~~~~~~
RAY - Ray-Tracing Programm
RAY2 - Post-Prozesseor, um das IFF/ILBM-Format zu erzeugen
DISPLAY - Zeigt die von RAY2 erzeugten Bilder
*.DAT - Eingabe-Dateien (ASCII) für RAY
*.TMP - RAY Ausgabe-Dateien
*.ILBM - RAY2 Ausgabe-Dateien
*.c - Alle MANX-Aztec C Quellcodes des Pakets
*.h - Alle MANX-Aztec C Include-Dateien
COPYING - Generelle Lizens-Bestimmungen
BITTE lest die Lizens-Bestimmungen (File 'COPYING'), bevor ihr weiterlest!
WEITERENTWICKLUNGEN:
~~~~~~~~~~~~~~~~~~~~
Abhängig vom Interesse an diesem Programm, wird der Autor an folgenden
Updates weiterarbeiten :
DBW_ED3D ein 3-dimensionaler Grafik-Editor (sodaß man die Eingaben
für RAY nicht mehr mathematisch angeben muß, sondern ein-
fach zeichnen kann.
DBW_FILM womit eine Filmsequenz aus HAM-Bildern möglich wird (dann
könnt ihr eure eigenen "Juggler"-ähnlichen Demos machen).
-------- eine Version des Programms für die Verwendung mit Speicher-
erweiterung und Fliesskomma-Coprozessor.
-------- Verbesserungen und Erweiterungen zum bestehenden Paket.
HINTERGRUND-INFORMATIONEN:
~~~~~~~~~~~~~~~~~~~~~~~~~~
Das DBW_Render Paket benutzt einen sogenannten 'Distributed Ray Tracing-
Alogarithmus'. Über eine ganz nette Lösung des Problems der 'versteckten
Linien' hinaus, bietet Ray-Tracing (generell) die Möglichkeit für
sehr realistische Schattierungs- und Beleuchtungs-Berechnungen.
Dieses Programm ist in MANX-Aztec C geschrieben und läuft auf jedem
Amiga. Das RAY-Programm kann Bilder erzeugen, die aus vier einfachen
geometrischen Objekten aufgebaut sind: Kugeln, Parallelogramme, Dreiecke
und flache Ringe. Hier einige der Besonderheiten des Programms:
- Bestimmung korrekter Schatten, erzeugt von beliebig platzierten
Lichtquellen, geworfen von beliebig geformten Objekten auf
beliebig geformte Objekte.
- Diffuse und theoretische Reflexionen (mit beliebigem Glanz oder
Politur). Bildung von diffus reflektiertem Licht zwischen den
Objekten, was unter anderem sehr gut Farbverwischungen bei
benachbarten, kontrastreich gefärbten Objekten simuliert.
- Spiegelungen mit einstellbarer Glätte und Zustand der Oberfläche.
- Lichtbrechung und Transparenz (was mikroskopisch feine Oberflächen-
Strukturierungen - ähnlich geätztem Glas - ermöglicht).
- Zwei Arten von Lichtquellen: direktes Licht (paralelle Lichtstrahlen)
mit konstanter Intensität und kugelförmiges Licht (wie Glühbirnen,
die entsprechend einer Funktion aus Radius und Entfernung einen
Halbschatten werfen), wobei hier die Intensität mit dem umgekehrten
quadratischen Gesetz abnimmt.
- Photographische Tiefenschärfe. D.h. die virtuelle Kamera kann auf
ein bestimmtes Objekt in der Szene eingestellt werden, wobei noch
die Blende verstellt werden kann, um die Tiefenschärfe anzupassen.
- Räumliche Strukturierung. Normalerweise wird ein einzelnes Objekt
(sagen wir eine Kugel) betrachtet, als hätte sie gleichmäßige
Eigenschaften, was oft unecht wirkende Gebilde zur Folge hat.
Räumliche Strukturierung ist ein Weg, die Oberflächen-Eigenschaften
alogarithmisch zu verändern (sodaß die ganze Oberfläche nicht
mehr gleichmäßig ist), um ein Material der realen Welt darzustellen.
Bis jetzt kann das Programm Holz, Murmeln, Backsteine, schnee-
bedeckte Berge, Wasser (mit beliebigen Wellen) und einige abstrakte
Dinge wie Farbverläufe erzeugen.
- Fractals. Das Programm enthält auch, was bekannt ist als 'Rekursive
Dreiecks-Teilung' und allerlei natürlich aussehende Gebilde hervor-
bringt (z.B.Felsbrocken,Berge,etc.). Die Eigenschaften des fraktalen
Gebildes (Grad der Feinheit,Verzerrung,etc.) wird mit Parametern des
Programms eingestellt.
- AI-heuristics, um die Rechenzeit einer Szene auf eine bestimmte
Länge festlegen zu können.
Wenn das RAY-Proramm läuft, liest es eine Art Kommando-Datei ein, die
eine geometrische Beschreibung der darzustellenden Szene incl. der
gewünschten Beleuchtung, Kameraposition, usw. enthält. Dann rechnet das
es lange Zeit und schreibt dabei jede errechnete Zeile auf Disk.
Hier das Format einer solchen Zeile (im .TMP-File):
<Zeile Nummer> - 2 Bytes
<Rote Pixels> - 160 Bytes (4 Bytes pro Pixel)
<Grüne Pixels> - 160 Bytes ( " )
<Blaue Pixels> - 160 Bytes ( " )
Für einen ganzen Bildschirm (400 Zeilen) ist dieses File 192.800 Bytes
lang. Ein zweites Programm (RAY2) wird benötigt, um eine der drei
folgenden Auflösungen für das Ausgabe-File zu generieren :
4096 Farben (HAM-Modus) Interlaced bei 320x400 Auflösung
32 Farben Interlaced bei 320x400 "
32 Farben bei 320x200 " (DP-Format)
Alle Dateiformate entsprechen dem IFF/ILBM Standard und können mit dem
mitgelieferten DISPLAY-Progamm angesehen werden.
Alles in allem repräsentiert das DBW_Render-Paket über 4000 Zeilen
C-Quellcode. Es basiert weitestgehend auf original Alogarithmen für
die VAX von Tom Dahl und Tone Engel bei Digital Equipment Corporation.
Die Übertragung auf den Amiga hat mehrere Monate gedauert.
RAY :
~~~~~~~
ZUR ERINNERUNG: BEVOR IHR IRGENDETWAS STARTET, MACHT EINE KOPIE
DIESER ORIGINAL-DISKETTE !!!
Sobald man ein Eingabe-File hat (Beschreibung weiter unten bei "Schreiben
eines .DAT-Files"), kann man den Ray-Tracer starten. Denkt aber daran,
daß die Ausgabe von RAY für einen ganzen Screen 192.800 Bytes oder über
400 Blocks beträgt. Vergewissert euch also, ob noch genug Platz auf der
Diskette ist. Es ist NICHT möglich die Ausgabe in die RAM-Disk umzuleiten
(Guru läßt grüßen)! Außerdem müßt ihr den Stack auf mindestens 10000 her-
aufsetzen (1> stack 10000).
Wenn nun das Eingabe-File z.B. 'glass.dat' heisst, kann RAY mit
1> ray glass
gestartet werden. Alle Optionen müssen im .DAT-File abgespeichert sein.
Seht euch das File 'glass.dat' auf dieser Disk mal an (1> type glass.dat).
Das Programm produziert beim Laufen ein Ausgabe-File Namens 'glass.tmp'.
Wenn ein anderer Name für das Ausgabefile als für das Eingabefile ge-
wünscht wird, kann man den Ray-Tracer auch nur mit
1> ray
starten. Dieser fragt dann nach dem Input-File:
Scene description file?
worauf man mit 'glass.dat' antworten kann. Das Programm fordert daraufhin
den Namen des Output-Files:
File name to save picture (.tmp)?
worauf man z.B. mit 'df1:glass.tmp' antwortet.
Das Programm wird nun das Bild errechnen. Beachtet, daß IMMER vier extra
Zeilen vor und nach der Szene gerechnet werden. Bei einem vollen Screen
von 400 Zeilen beginnt das Programm also mit Zeile -4 und endet mit
Zeile 403. Das liegt daran, daß die AI-heuristics eine ganze Zeile
zwischenspeichern müssen, bevor sie sie ausgegeben können.
Wenn das Programm fertig ist, gibt es einige Statistiken über das Bild
aus. Am interessantesten sind dabei die 'GUESSED'(vergessenen), im Gegen-
satz zu den 'COMPUTED'(gerechneten) Pixels. Dies gibt einen Hinweis auf
die zu erwartende Qualität des Bildes (0=perfekt). Diese Zahlen werden
von der im Kommando-File angegebenen Rechenzeit ('R') bestimmt.
RAY2 :
~~~~~~~~
Nachdem RAY seine Arbeit getan hat, kann das (oder die) Ausgabe-.TMP-File
von RAY2 nachbearbeitet werden. Aus folgenden Gründen können mehrere Files
angegeben werden:
1) Falls die Maschine abstürtzt und man konnte einen Teil retten,
so kann dieser weiterverwendet werden.
2) Man kann das Bild in Streifen rechnen lassen.
3) Wenn einige Teile aufgrund zu geringer Rechenzeit verwaschen
sind, kann man sie auf diese Weise nachberechnen lassen.
Das alles wird klarer wenn wir das Beispiel mit
1> ray2 glass
starten. Nun wird die Datei 'glass.tmp' (Ausgabe von RAY) geöffnet.Beim
Lesen werden die am meisten verwendeten Farben herausgesucht, ein Custom-
Screen geöffnet und das Bild gemalt .Dann werden die Daten wieder vom Bild-
schirm gelesen und in eine neue Datei 'glass.ilbm' geschrieben. Wenn
das Programm fertig ist, blinkt der Bildschirm kurz auf und man kann das
Programm mit einem unsichtbaren Schliess-Gadget links oben beenden.
Während das Programm in die Ausgabedatei schreibt, wird der erste Pixel
jeder Zeile invertiert, sodaß man den Vorgang am Bildschirm verfolgen kann.
Hier ein Beispiel, bei dem alle Optionen von RAY2 verwendet werden:
1> ray2 -c 1 -h 1 -l 1 -o glass.ilbm glass
Die Optionen sind:
-c = Komprimiertes Datenformat (0 oder 1) (default = ja = 1)
-h = Hold-And-Modify Modus (0 oder 1) (default = ja = 1)
-l = Interlace Modus (0 oder 1) (default = ja = 1)
-o = Name des RAY2-Ausgabe-Files
<name> = ein bis zu 10 Buchstaben langer Filename
Das gezeigte Beispiel wird genau das gleiche Bild ergeben, wie das vorher-
gehende (weil nur die default-Werte genommen wurden). Wenn wir das ein-
fachste Format (DeluxePaint) wollen und wir haben mehrere .TMP-Files,
können wir schreiben:
1> ray2 -h 0 -l 0 -o glass.pic glass1 glass2 glass
Das Programm übernimmt IMMER (wenn möglich) die Zeilen der vorangehenden
Dateien. So enthält zum Beispiel die Datei 'glass.tmp' ein komplettes
12-Stunden Bild. 'glass1.tmp' und 'glass2.tmp' enthalten die Zeilen um
die Lichtquellen herum, die im 'glass.tmp'-File verwaschen sind, nur mit
einer Auflösung von 24 Stunden, sodaß sie wesentlich besser werden (jedes
braucht etwa eine Stunde).
RAY2 beinhaltet ebenfalls AI-heuristics, um die 4096 Farben in eine
Palette mit 32 Farben umzurechnen (wenn der HAM-Modus abgeschaltet ist).
DISPLAY :
~~~~~~~~~~~
DISPLAY wird ganz einfach mit
1> display glass
gestartet, worauf 'glass.ilbm' auf dem Bildschirm gezeigt wird. Man
kann aber auch den ganzen Namen (z.B.'glass.pic') angeben, wenn er nicht
mit '.ILBM' endet.
Das Bild wird angezeigt, bis wiederum das unsichtbare linke obere Schliess-
Gadget angeklickt wird. Nicht vergessen: Mit <Amiga-n> bzw. <Amiga-m> kann
zwischen Workbench- und DISPLAY-Screen umgeschaltet werden.
SCHREIBEN EINES .DAT-FILES:
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Okay, nun zum harten Teil: Der Inhalt des Script-Eingabe-Files (.DAT)!
Die Datei ist ein Standard ASCII Text File, wobei jede Zeile ein Objekt
definiert oder ein anderes Kommando für RAY darstellt. Jede Zeile beginnt
mit einem - großen oder kleinen - Buchstaben, der für das jeweilige Kom-
mando steht. Die Kommandos sind:
R - Auflösung (default = 12.0 Stunden)
N - genereller Lichtbrechungs-Faktor (default = 1.0)
Z - Erzeugen eines 2D-Histogramms (default = 3D)
a - verstärktes Umgebungslicht (default = 0.0)
A - Antialiasing (default = kein Antialiasing)
F - Tiefenschärfe und Blende der Kamera (default = unendlich)
M - generell diffuse Beleuchtung (default = nicht diffus)
& - Start- und End-Zeile der Berechnung
*,! - Kommentar (wird ignoriert)
b - Hintergrund-Farbwerte
w - Wellenstruktur
g - Farbverlauf
n - Schneefall
k - 3D-Schachbrettmuster
H - genereller Dunst-Faktor (default = keine Vergrauung)
f - Fractal-Struktur
m - Murmeln-Struktur
d - Holz-Maserung
e - Kamera-Blickpunkt und -Richtung
l - paralleles Licht
L - kugelförmiges Licht
{ - Start einer Erweiterung
} - Ende der Erweiterung
s - Kugel \
t - Dreieck \
x - Fractal => Objekte
q - Paralellogramm /
r - Ring /
Zunächst einmal bestehen alle Farbangaben aus drei Zahlen zwischen 0 und 1.
Die Reihenfolge ist BLAU, GRüN, ROT.
Alle Positions- und Richtungsangaben sind aus drei zueinander relativen
Werten mit freier Maßeinteilung zusammengesetzt, und zwar in der Reihen-
folge 'X,Y,Z'. Angenommen man schaut in negativer Z-Richtung in den
Bildschirm, dann ist positiv-X nach rechts, positiv-Y nach oben und
positiv-Z senkrecht aus dem Bildschirm heraus.
Okay, nun zu den Eigenheiten der einzelnen Parameter. Zuerst kommen die
generellen Kommandos (Strukturdefinitionen usw.), dann folgen die Kommandos,
die die Objekte definieren.
Genereller Lichtbrechungs-Faktor
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
N INDEX (0-1)
Dieser Wert wird als Index für die Lichtbrechung der Luft verwendet.
Auflösung
~~~~~~~~~
R AUFLÖSUNG (1.0-30.0)
Die Auflösung bestimmt die MAXIMALE Rechenzeit für einen 400-Zeilen-
Bildschirm. Sie wird in Stunden angegeben und sollte zwischen 1.0 und
30.0 liegen. Je mehr Zeit das Programm bekommt, desto besser wird
natürlich auch das Bild.
Erzeugung eines 2D-Histogramms
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Z FLAG (0/1)
Normalerweise entspricht der Inhalt eines .TMP-Files, das RAY
produziert einer binären Pixel-Version der Szene. Wie auch immer,
um die Berechnung einer Szene mit Antialiasing zu beschleunigen,
kann man in der Kommando-Datei den Befehl 'Z 1' angeben. Dann wird
das Bild als eine Art 2D-Histogramm in Graustufen im .TMP-File
abgelegt (je heller, desto mehr Rechenschritte werden für einen
Pixel benötigt). Dieser Befehl ist aber nur sinnvoll, wenn der
Antialiasing-Wert 'A' nicht auf default (1 1.0) steht. Wenn doch,
wird grundsätzlich die gleiche Zeit für jeden Pixel aufgewendet, und
das Z-Kommando führt zu einer einheitlich grauen Fläche. Der A-Befehl
aber sagt dem Ray-Tracer, daß er sich auf bestimmte Details konzen-
trieren soll,um dadurch ein Aliasing-freies Bild zu erzeugen. Mit
dem Z-Kommando kann man nun die besonders rechenintensiven Bereiche
(wo der Ray-Tracer Kanten glättet) sichtbar machen.
Verstärktes Umgebungslicht
~~~~~~~~~~~~~~~~~~~~~~~~~~
a FAKTOR (0.0-1.0)
Wie weiter unten beschrieben, enthält jedes Objekt einer Szene Para-
meter, die kontrollieren, wie hell das Objekt erscheint, wenn kein
Licht darauf fällt. Man kann also ein Objekt im Schatten heller
darstellen, als ein anderes. Alternativ kann man einen FAKTOR von
0 bis 1 angeben und das Umgebungslicht wird als Bruchteil seiner
diffusen Helligkeit dargestellt. Wenn dieser Parameter angegeben
wird, haben die BGR-Umgebungslicht-Werte der einzelnen Objekte
keine Wirkung mehr (müssen aber trotzdem definiert werden). Ein
annehmbarer Anfangswert für FAKTOR liegt zwischen 0.1 und 0.2.
Antialiasing
~~~~~~~~~~~~
A ANZAHL THRESHHOLD
Beim default-Wert (1,1.0) berechnet der Ray-Tracer für jeden Pixel
des Bildes genau einen (Licht-)Strahl (ein 320x400 Pixel großes Bild
ergibt also ca. 128000 Strahlen). Desöfteren entstehen bei digitaler
Generierung eines Bildes mit nur einem Strahl unangenehme Nebeneffekte.
So werden zum Beispiel diagonale Linien als abgesetzte Treppenstufen
dargestellt -- diese fürchterlichen Zacken! Solche falschen Erschei-
nungen werden 'Aliasing Effekt' genannt. Es wurden vielerlei Tech-
niken erfunden, um die Auswirkungen dieses Effekts zu reduzieren,
die sich alle auf Anti-Aliasing beziehen (es gibt noch viele andere
Arten von Aliasing-Effekten neben Zacken. Ein weiteres Beispiel sind
die messerscharfen Schatten, die man traditionellerweise in Computer-
Bildern findet -- reale Schatten sind immer ein bißchen verschwommen).
Die ANZAHL gibt an, wieviel Strahlen pro Pixel verfolgt werden;
je mehr, desto besser, aber desto langsamer geht's. Ein guter Start-
Wert ist 4. Es wird dann ein Bündel von vier Strahlen zufällig in
den 'Pixel-Kegel' geschickt, die über die horizontale und vertikale
Dimension verteilt (distributed) sind; daher sagt man, daß dieser
Ray-Tracer 'Distributed Ray Tracing' beherrscht.
Der THRESHHOLD-Wert bezieht sich auf eine etwas kompliziertere
Eigenschaft des Ray-Tracers, genannt 'Statistically Optimized Distri-
buted Ray Tracing' (statistisch optimierte verteilte Strahlen-Verfol-
gung). Das geht so vor sich, daß das Programm die Stärke der ein-
zelnen Strahlen des Bündels berechnet, die auf den Pixel 'verteilt'
werden; also die statistische Abweichung der z.B. vier Intensitäten.
Wenn die Abweichung klein ist, ist es wahrscheinlich, daß dies eine
glatte Stelle im Bild ist.
Es wird also eine gute Annäherung an die Original-Intensität des
Pixels erreicht. Aber angenommen, der Pixel befindet sich gerade an
einer diagonalen Kante, so werden einige der Strahlen auf die eine
Fläche geworfen und einige auf die andere. Die Abweichung wird also
groß sein. Das Programm beachtet dies, und wenn die Abweichung den
THRESHHOLD-Wert überschreitet, 'verteilt' es eine weitere Gruppe von
(in diesem Fall) vier Strahlen auf den Pixel. Nun wird die Intensi-
täts-Abweichung der acht Strahlen errechnet und der Vorgang wieder-
holt, bis entweder die gewünschte Glätte, oder die beliebig einge-
stellte maximale ANZAHL Strahlen erreicht ist. THRESHHOLD-Werte
größer oder gleich 1.0 bewirken keine extra Bündel außer dem mit
ANZAHL angegebenen. Sinnvolle Werte für THRESHHOLD liegen im Bereich
von 0.0001 bis 0.1.
Tiefenschärfe und Blende der Kamera
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F BLENDE ENTFERNUNG
Wenn dieses Kommando weggelassen wird, werden alle Objekte perfekt
Scharf abgebildet. Mit ihm kann man aber nun Tiefenschärfe-Effekte
erzielen (was die Rechenzeit wiederum erheblich steigert!).
Die BLENDE bestimmt die Größe der Kameralinse. Sie hängt wie auch die
ENTFERNUNG vom verwendeten Koordinatensystem ab; aber vorausgesetzt
eine Einheit steht für einen Zentimeter und die ENTFERNUNG beträgt
100 Einheiten, dann sollte sich BLENDE zwischen 0.5 und 2.0 bewegen.
Um einen sanften Verlauf von Vordergrund zu Hintergrund zu er-
reichen, muß man den Anti-Aliasing Parameter (A-Kommando) ANZAHL auf,
sagen wir, 20 bis 30 und THRESHHOLD auf 1.0 setzen.
Generell diffuses Licht
~~~~~~~~~~~~~~~~~~~~~~~
M ANZAHL ZÄHLER NENNER
Dieser Befehl bezieht sich auf die realistische Ausbreitung des Lichts,
wenn es von Objekt zu Objekt reflektiert wird. Üblicherweise werden bei
einer computerberechneten Beleuchtung die Oberflächen der Objekte ent-
sprechend ihrer Farbe, ihres Materials und der Stärke des Lichts ein-
gefärbt. Die Teile, die nicht direkt im Licht liegen werden schwarz
gezeichnet. Nun, das sieht sehr künstlich aus und deshalb wird den
schattigen Bereichen ein konstanter Farbwert zugeordnet (hier mit dem
'a'-Kommando bzw. dem individuellen Umgebungslicht(s.u.)).
In der Realität gibt es aber auch im Schatten Licht, das von anderen
Gegenständen reflektiert wird. Dazu dient der 'M'-Befehl (leider erhöht
sich dadurch die Rechenzeit wieder einmal mehr). Das Programm sammelt
nun für jeden Pixel weitere zufällige Strahlen, um zu ergründen, was
in der näheren Umgebung noch als Reflektor arbeitet. Die ANZAHL be-
stimmt dabei, vieviel Strahlen hinzugenommen werden. Werte von 10 an
aufwärts sind möglich; bei 100 und mehr erhält man weiche Farbverläufe.
ZÄHLER UND NENNER haben mit der rekursiven Natur des Ray-Tracings
zu tun: angenommen, ein Strahl wird berechnet, der auf die dargestellte
Oberfläche fällt und dabei auch die benachbarte Fläche berührt. Von
dieser Fläche wird nun auch ein Strahlenbündel genommen, um ihre Farbe
zu berechnen usw. Dabei schwillt die Anzahl der Strahlen exponentiell
an. Um das zu verhindern, wird für jede Rekursion die Anzahl der
Strahlen auf einen Bruchteil von ANZAHL gesetzt. Dieser Bruch wird
mit ZÄHLER und NENNER angegeben und sollte bei bei 1/3 bis 1/4 liegen.
Start- und End-Zeile
~~~~~~~~~~~~~~~~~~~~
& START ENDE
Wird der Befehl weggelassen, wird ein komplettes Bild mit 320x400
Pixel errechnet. Das Programm geht von Zeile START bis ENDE-1. Man
kann komplexere Szenen auch in Stücken rechnen und mit RAY2 nachher
zusammenmischen.
Hintergrund-Farbe
~~~~~~~~~~~~~~~~~
b BLAU GRüN ROT
Einfach die drei Farbwerte für den Hintergrund.
Wellenstruktur
~~~~~~~~~~~~~~
w ZENTRUM-X Y Z WELLENLÄNGE AMPLITUDE DÄMPFUNG PHASE
Einige Parameter des Programms benutzen Wellenformen als Basis für
ihre Effekte (am auffälligsten bei geriffelten Oberflächen,z.B.Wasser).
Man kann bis zu 100 Wellenformen pro Szene definieren wobei das Pro-
gramm eine Wellenform-Tabelle anlegt, auf die die jeweiligen Befehle
zugreifen. Die ersten drei Zahlen (ZENTRUM-X Y Z) legen die Mitte der
konzentrischen Welle fest. WELLENLÄNGE ist die Strecke von einem
Wellenberg zum nächsten. AMPLITUNDE gibt die Höhe der Welle durch
einen Wert zwischen 0.1 (flach) und 0.5 (hoch) an. Mit DÄMPFUNG stellt
man die Abnahme der Höhe bei Entfernung vom Mittelpunkt ein. 1.0 be-
deutet: keine Dämpfung; bei 0.7 beträgt die Höhe der folgenden Welle
70% der vorhergehenden. PHASE bestimmt die Starthöhe der Welle. Die
Werte gehen von 0.0 (Wellenberg) über 0.5 (Tal) bis 1.0 (Berg). Das
kann bei Bildsequenzen bewegtes Wasser simulieren.
Farbverläufe
~~~~~~~~~~~~
g FARBE-BLAU GRüN ROT START BEREICH
Normal hat ein Objekt von oben bis unten die gleiche Farbe. Mit diesem
Kommando aber kann man einen Verlauf der Farbe in Richtung der Y-Achse
programmieren. Bis zu 10 solcher Verläufe sind möglich.
FARBE-BLAU GRÜN ROT bestimmt die Farbe, zu der die Grundfarbe des Ob-
jekts (angegeben unten bei 'diffuses Objektlicht') hin verläuft. START
definiert die Y-Koordinate, bei der diese überblendung beginnen soll.
Alle Punkte darunter werden in der Grundfarbe des Objekts gemalt.
BEREICH gibt die Y-Einheiten an, über die sich der Verlauf erstreckt.
Alle Punkte oberhalb START+BEREICH werden in der mit FARBE-B G R
bestimmten Farbe gemalt.
Schneefall
~~~~~~~~~~
n START BEREICH FAKTOR THRESHHOLD
Diese Oberflächenstruktur ist den Farbverläufen sehr ähnlich (und
außerdem noch in Arbeit). Sie ist hauptsächlich für die unten be-
schriebenen Fractalen Gebilde gedacht, um sozusagen Schnee darauf
zu verteilen; und zwar je höher, desto mehr.
START ist die Y-Koordinate, ab der überhaupt Schnee liegt. BEREICH
gibt die Höhe des schneebedeckten Feldes an. Der Teil oberhalb
von START+BEREICH ist ganz bedeckt. FAKTOR ist ein Regler, um die
Stärke des 'Schneefalls' in Abhängigkeit von der Höhe zu setzen.
Bei 0.0 findet keine Beeinflussung statt. Werte über 1.0 resultieren
in einem schnelleren Aufbau der Schneedecke schon am unteren Rand von
BEREICH (?;siehe Beispiel 'island.dat'). Mit THRESHHOLD läßt sich eine
Beziehung zwischen Höhe, Steigung und Schneedecke herstellen. Bei 0.0
wird alles ab START ganz bedeckt sein; bei Werten zwischen 0.0 und 1.0
resultiert die Schneedecke aus einer Funktion aus Steigung und Höhe.
Bei THRESHHOLD 0.4 wird die Oberfläche ab etwa 40 Grad Steigung zuneh-
end mit Schnee bedeckt.
3D-Schachbrett-Muster
~~~~~~~~~~~~~~~~~~~~~
k FARBE-BLAU GRÜN ROT X Y Z JUNK1 JUNK2 JUNK3
Bis zu 10 Schachbrettmuster können definiert werden. Sie können 1-
(Schichten), 2- (Schachbrett,Spalten) oder 3-dimensional (Würfel)
sein. Aufgrund der Farbe eines Oberflächenpunktes bestimmt diese
Funktion, ob der Punkt die Originalfarbe des Objekts, oder die mit
FARBE-BLAU GRüN ROT angegebene Farbe bekommt. Um festzusetzen, wel-
cher Punkt in welcher Farbregion liegt, gibt es die X Y Z -Parameter.
X definiert die Breite, Y die Höhe und Z die Tiefe der aufeinander
folgenden Schichten. Beachtet, das ein oder mehrere dieser Parameter
auf 0 gesetzt werden können, um die Dimensionalität zu beschränken.
Wenn z.B. Y=0 ist ergeben sich waagerechte Schichten abwechselnder
Farbe. Wenn alle drei ungleich 0 sind und unterschiedliche Werte
haben, entsteht ein 3-dimensionales Blockmuster.
Die JUNKs werden in dieser Version noch nicht benutzt und sollten
auf 0 gesetzt werden.
genereller Dunst-Faktor (Vergrauung)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
H FARBE-BLAU GRÜN ROT ENTFERNUNG
Ohne diesen Befehl ist die Farbe einer dargestellten Oberfläche unab-
hängig von der Entfernung zum Betrachter. Bei Benutzung des Dunst-
Faktors kan man den Ray-Tracer veranlassen, die Farben der weiter
entfernten Objekte kontinuierlich zu der (mit FARBE-B G R) angegebenen
Farbe fließen zu lassen (natürlicherweise ein bläuliches Grau). Alle
Punkte, die weiter, als ENTFERNUNG vom Kameraauge weg sind, werden in
der Dunst-Farbe gemalt, und sind somit unsichtbar.
Fractal-Strukturen
~~~~~~~~~~~~~~~~~~
f WIEDERHOLUNGEN VERHÄLTNISS-X Y Z OBERFLÄCHE
Diese Struktur kann nur für Fractal-Objekte (s.u. bei 'x'-Kommando)
benutzt werden. Bis jetzt kann der Ray-Tracer nur eine kleine Anzahl
primitiver Formen bilden, wovon eines das Dreieck ist. Wie beim
'x'-Kommando weiter unten beschrieben, hat er aber die Fähigkeit,
komplexe Gebilde zu errechnen, die aus vielen, zusammemhängenden
Dreiecken bestehen und 'Stochastische Flächen' genannt werden (oft
als fraktale Flächen bezeichnet, obwohl der Zusammenhang zur Mathe-
matik der Fractals begrenzt ist). Dieser Befehl definiert die Para-
meter, die der Ray-Tracer für die Konstruktion des Dreiecks-Netzes
braucht.
Um eines von 10 möglichen Fractals definieren zu können, benötigt
man mindestens eine Wellenform ('w'-Kommando). Der Vorgang einer
Fractal-Erzeugung basiert auf wiederholter Dreiecks-Teilung, unter
Verwendung von komplexen Koordinaten-Verschiebungen bei der Bestimmung
der Scheitelpunkte des geteilten Dreiecks. Man beginnt mit einem Haupt-
Dreieck, das die ungefähre Größe und Lage des Objekts angibt ('x'-Kom.).
Das Originaldreieck wird durch Halbierung der Seiten in vier kleinere
Dreiecke geteilt, wobei die Ecken der neuen Dreiecke im Raum ver-
schoben werden. WIEDERHOLUNGEN gibt an, wie oft die Teilung ausgeführt
wird. Je größer diese Tiefe, desto feiner wird die fraktale Oberfläche,
aber die Rechenzeit geht wieder 'mal hoch. Außerdem brauchen größere
Werte große Mengen an Speicher, da die Daten der generierten Dreiecke
dort abgelegt werden (bei einem Wert von '7' z.B. tausende von 512-Byte
Speicherseiten, also seid vorsichtig!).
Die drei Parameter VERHÄLTNISS-X Y Z erlauben es, die Verzerrung in
eine bestimmte Richtung zu lenken (bei X=1 und Z=1 und Y=3.0 entsteht
z.B. ein dreimal höher als breites Fractal-Gebilde). Bei VERHÄLTNISSen
gleich 0 werden keine Höhenabweichungen in der jeweiligen Richtung aus-
geführt (Wenn alle drei 0 sind, sieht man ein flaches Dreieck von oben).
OBERFLÄCHE bestimmt eine Struktur für das komplette Fractal (die
Werte entnimmt man den unten aufgeführten Objekt-Strukturen).
Wie oben erwähnt, braucht man für eine bewegte Fractal-Oberfläche
ein paar Wellenformen. Ein guter Anfang sind 5 oder 6, deren Ausgangs-
punkte über die ganze Szene verstreut sein sollten. Unterschiedliche
Wellenlängen und Amplituden verstärken die Verzerrung des Fractals.
Die Wellen-DÄMPFUNG sollte gering sein (um 1.0). Die genaue Art und
Weise, wie die Wellen auf das Fractal wirken, liegt jenseits jeder
vernünftigen Beschreibung; es genügt zu sagen, daß kein Zufall im Spiel
ist, und verschiedene Wellenformen ergeben ausgesprochen unterschied-
liche Formen; experimentiert !((und wartet...))
Murmel-Strukturen
~~~~~~~~~~~~~~~~~
m INBLAU INGRüN INROT XMAß TURBULENZ DICKE
Man kann bis zu 10 Murmel-Strukturen definieren. Hier benötigt man
ebenfalls mindestens eine Wellenform.
Murmeln bestehen aus einem Basismaterial und Einschlüssen aus einem
anderen Stoff. Die Grundfarbe wird durch die Angabe bei 'diffuse Re-
flexion' (s.u.) festgelegt. Die Farbe der Einschlüsse wird durch
INBLAU INGRüN und INROT bestimmt. Die resultierende Farbe ist ein
komplexer Verlauf der beiden Materialfarben.
Es werden ein paar Schichten entlang der X-Achse, zunächst alle an
derselben Stelle, positioniert. Ihre Breite wird mit XMAß angegeben
(Werte von 0.1 bis 1.0). Dann wird die TURBULENZ hinzugefügt, um die
Schichten in unzählige Windungen und Streifen zu verwandeln. Werte
zwischen 1.0 und 3.0 sind ganz hübsch. Die grobe DICKE der Streifen
wird mit einem Integer (ganze Zahl) angegeben, wobei '1' normale, '2'
halbe, '3' ein viertel der Dicke usw. ergibt.
Die Turbulenz wiederum wird von den definierten Wellenformen beein-
flusst. Die Beziehung zwischen einer bestimmten Wellenform und der
resultierenden Turbulenz ist unmöglich vorherzusagen. Alles was getan
werden kann, ist, grobe Richtlinien für die Parameterwerte zu geben.
Zunächst werden 4 oder 5 Wellenformen benötigt. Die Zentren sollten
gut über die ganze Szene verteilt sein. Die Wellenlängen sollten stark
variieren (manche vier und fünfmal so lang sein, wie andere). Dämpfung
sollte keine eingestellt sein (0.95-1.0).
Holz-Strukturen
~~~~~~~~~~~~~~~
d BLAU GRÜN ROT STÄRKE RINGMAß TURBULENZ DICKE
Wieder sind 10 Holz-Strukturen pro Szene möglich. Wieder muß mindes-
tens eine Wellenform definiert sein. Die Holz-Struktur wird ganz
ähnlich, wie die Murmel-Struktur erzeugt, außer, daß das Holz nicht
aus Schichten aufgebaut wird, sondern aus konzentrischen Röhren des
Basismaterials entlang der Y-Achse. RINGMAß entspricht dem XMAß bei
den Murmeln, ebenso verhalten sich TUBULENZ und DICKE. STÄRKE kon-
trolliert, wie stark oder schwach die Maserung ausgebildet wird.
Werte über 1.0 verstärken die Maserung, Werte unter 1.0 dämpfen sie.
Kameraposition und Blickrichtung
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
e XPOS YPOS ZPOS XBLICK YBLICK ZBLICK XUP YUP ZUP
Die ersten drei Zahlen setzen die Position der imaginären Kamera. Die
nächsten drei bestimmen die Richtung relativ zu diesem Punkt und
definieren, was zu sehen ist. Die Länge dieses Vektors bewirkt einen
'Tele/Weitwinkel-Effekt', wobei der Bildschirm an seiner Spitze mit
einem Verhältnis von 256 zu 170 Einheiten dargestellt wird. Kamera-
position und die Länge des Blickrichtungs-Vektors sind also eng mit-
einander verknüpft und bilden zusammen den Blickwinkel (oder -Kegel).
Die letzten drei Parameter geben eine Höhe an, um die der Blickpunkt
heraufgesetzt wird; normalerweise wird man mit 0 1 0 hinkommen.
Paralleles Licht
~~~~~~~~~~~~~~~~
l BLAU GRÜN ROT XRICHT YRICHT ZRICHT
Die ersten drei Parameter stehen für die Farbe bzw. Intensität der
Lichtquelle (1.0 1.0 1.0 entspricht Weiss, 0.5 0.5 0.5 ist dunkles
lila). Die restlichen drei Werte geben die Richtung an, aus der das
Licht kommt. Bei '1 0 0' z.B. negativ entlang der X-Achse. Man kann
maximal 100 Lichtquellen definieren; aber viele Lichter verlaaaaaa-
aaangsamen die Sache nocheinmal. Zwei sind vertretbar.
Kugelförmiges Licht
~~~~~~~~~~~~~~~~~~~
L BLAU GRüN ROT ZENTRUM-X Y Z AUSBREITUNG RADIUS
Das erste Zahlentripel entspricht dem bei parallelem Licht. Die drei
nächsten Daten bestimmen die Position des Mittelpunktes, der über-
all inner- oder außerhalb des sichtbaren Bereichs liegen kann. Be-
achtet aber, daß die Lichtquelle selbst nie sichtbar ist! Wenn man
also z.B. eine Glühbirne will, muß man auf die gleichen Koordinaten
eine durchsichtige Kugel mit dem gleichen Radius setzen. Die AUS-
BREITUNG gehorcht dem umgekehrten quadratischen Gesetz, nach dem
die Helligkeit innerhalb der Szene vermindert wird. Um zu verdeut-
lichen, wie man einen Wert für AUSBREITUNG findet, hier ein Beispiel:
Angenommen, man will mit einer Glühbirne bei vollem Licht (1 1 1)
einen Tisch im Abstand von z.B. 37 Einheiten gut ausleuchten, so
setzt man AUSBREITUNG auf eben diese 37 Einheiten. Dann werden Gegen-
stände, die näher beim Licht liegen überbelichtet und diejenigen, die
weiter weg sind als 37 Einheiten, werden immer schwächer beleuchtet.
RADIUS bestimmt den Licht aussendenden Kreis, der bei '0' punktförmig
ist, was wesentlich schneller zu berechnen ist. Außerdem sollte man
bei größeren Radien den Antialiasing-Faktor ('A'-Kommand) hochsetzen,
da diese viele Halbschatten erzeugen.
Nun endlich zur Definition der einzelnen Objekte. Das können bis zu 1000
pro Szene sein ! Alle Objekte verfügen über die selben grundlegenden
Parameter. Genauer gesagt beginnt jede Objekt-Definition mit folgenden
Angaben ('*' steht für das jeweilige Objekt-Kommando (s,q,x,t,r)):
* STRUKT FUZZ SPIEGEL INDEX TRANSP-B G R UMLICHT-B G R DIFREFL-B G R
STRUKT ist ein Integerwert, der dem Objekt eine gewünschte (und defi-
nierte) Oberflächen-Struktur zuordnet. '0' bewirkt eine glatte,
einheitlich gefärbte Oberfläche. Positive Werte kann man aus
folgenden Struktur-Funktionen auswählen :
WERT STRUKTUR-FUNKTION
------ -------------------
1: Farbverlauf in Y-Richtung
Angefangen bei Y=0, verläuft die Farbe von rot über blau
zu grün und zurück nach rot bei Y=20. Dies wiederholt sich
alle 20 Y-Einheiten.
3: Gesprenkeltes Wirrwarr
Die Helligkeit der Objekt-Oberfläche wird von einem ge-
sprenkelten Muster variiert. Diese Struktur benötigt
einige definierte Wellenformen.
4: Wellige Oberfläche
Das sieht wie gekräuselte Wellen aus und wenn Reflektion
gesetzt ist, werden die Spiegelungen geriffelt.
5: Backsteinmuster
Hier wird das Objekt wie eine Backsteinmauer dargestellt.
Die Steingröße ist festgelegt auf Höhe=3.0, Breite=4.0
und Länge=8.0; die Mörteldicke beträgt 0.5. Die Farbe der
Steine wird durch die 'diffuse Reflektion' des Objekts be-
stimmt; die Farbe des Mörtels ist Blau=0.8, Grün=0.85 und
Rot=0.99. Die Backsteine liegen entlang der Koordinaten-
Achsen.
10...19: Einzelne Welle
Wie Struktur 4, nur daß die Oberfläche von nur einer Welle
beeinflußt wird. Nummer 10 ist die erste definierte Welle,
Nummer 11 die zweite usw. bis zur zehnten (Nr.19).
20...29: Murmel
20 benutzt die erste Murmeldefinition usw. (1-10).
40...49: Holz-Maserung
Nimmt entsprechend die definierten Holz-Strukturen (1-10).
50...59: Schachbrett
Weist die beschriebenen Schachbrettmuster zu (1-10).
60...69: Fractal-Struktur
Das ist eigentlich keine Oberflächenstruktur an sich (in-
sofern, als hier keine Farbänderung stattfindet). Sie kann
nur bei Fraktalen Objekten ('x'-Kommando) verwendet werden
und ordnet dem Objekt die gewünschte Fraktal-Struktur zu.
70...79: Weicher Farbverlauf
Verwendet einen der definierten Farbverläufe (1-10).
80...89: Schnee
80 ist die erste angegebene Schneefall-Struktur, 81 die
zweite usw. wie bei allen anderen auch bis zur zehnten=89.
FUZZ (wörtlich 'Fussel') ist eine Pseudo-Struktur-Wert von 0.0 bis
1.0, der die Oberfläche mit einen Zufalls-'Flaum' überzieht. Das
kann verwendet werden, um weiche Oberflächen, ähnlich Tennisbäl-
len, alte, verschleierte Spiegel, geätztes Glas oder Änliches
darzustellen.
SPIEGEL ist ein Wert von 0.0 bis 1.0, wobei '0.0' keine spektralen
oder spiegelnden Reflektionen hervorruft, und '1.0' gleich 100%
spiegelnd bedeutet.
INDEX ist der Index der Lichtbrechung des Objekts. Er wirkt aber nur
bei durchsichtigen Objekten (um 1.0).
TRANSP-B, -G, -R bestimmen die Transparenz des Objekts für jede
Farbe getrennt. Bei '1.0 1.0 1.0' ist es ganz durchsichtig.
UMLICHT-B, -G, -R sind Werte für das Umgebungslicht (Helligkeit im
Schatten). Bei '1.0 1.0 1.0' bestitzt der Gegenstand sehr STARKES
Umgebungslicht, was die Farben aber auch stark auswäscht.
DIFREFL-B, -G, -R legt nun endlich die eigentliche Farbe des Objektes
fest (natürlich in Abhängigkeit von den gewählten Lichtquellen...)
und nennt sich 'diffuse Reflektion'. Glas hat zum Beispiel über-
haupt keine diffuse Reflektion während Kalk fast die Werte '1 1 1'
erhalten müßte.
Man beachte, daß auch irrationale Objekte, z.B. mit 100% Spiegelung und
100% Transparenz, kreiert werden können.
Nun zu den einzelnen Objekt-Befehlen. Ihre Parameter FOLGEN (stehen rechts
von) den anderen, zuvor aufgeführten Werten ! Zum Beispiel:
s strukt fuzz spieg ind trans-BGR uml-BGR difr-BGR ZENTRUM-X Y Z RADIUS
- --------------------
Kugel:
~~~~~~
s ... ZENTRUM-X Y Z RADIUS
Erklärt sich selbst.
Parallelogramm:
~~~~~~~~~~~~~~~
q ... POSX POSY POSZ VL-X VL-Y VL-Z VR-X VR-Y VR-Z
Mit POS-X Y Z setzt man eine Ecke des Vierecks irgendwo ins Koordina-
tensystem. Die folgenden beiden Zahlentripel sind zwei Vektoren, die
zwei Seiten des Parallelogramms relativ zu diesem Eckpunkt bestimmen.
Und nun das schwierige daran: auf die Anordnung dieser beiden Vektoren
kommt's an. Um es einfach zu sagen: VL ist von 'oben' gesehen der
linke und VR der rechte Vektor. Andersherum wird das Objekt unsicht-
bar (der Autor empfiehlt allerdings, damit zu experimentieren). Die
Vektoren müssen natürlich nicht rechtwinklig zueinander stehen.
Dreieck
~~~~~~~
t ... POSX POSY POSZ VL-X VL-Y VL-Z VR-X VR-Y VR-Z
Das selbe wie beim Parallelogramm.
FRACTAL:
~~~~~~~~
x ... POSX POSY POSZ POS1X POS1Y POS1Z POS2X POS2Y POS2Z
Es wird ebenfalls ein Dreieck konstruiert, wobei die drei Eckpunkte
- im Gegensatz zum einfachen Dreieck - jedoch absolut anzugeben sind.
RING:
~~~~~
r ... ZENTRUM-X Y Z VL-X VL-Y VL-Z VR-X VR-Y VR-Z MINRAD MAXRAD
Ringe sind eine Art Parallelogramm. Die beiden Vektoren müssen hier
aber rechtwinklig zueinander stehen und bestimmen lediglich die
Fläche, in der der Ring mit dem Mittelpunkt ZENTRUM, dem Innenradius
MINRAD und dem Außenradius MAXRAD liegt. Bei MINRAD=0 entsteht eine
flache Scheibe.
Zeilen mit { und } können beliebige Kommandos umschließen und so zusam-
menfassen. Dies erlaubt dem Programm durch die Berechnung erweiterter
Bereiche um die beschriebenen einfachen Objekte herum und Prüfung der
Strahlen-Schnittpunkte optimiertes Ray-Tracing zu betreiben, was schneller
ist, als die einzelne Berechnung der eingeschlossenen Objekte. Solche
Erweiterungen können auch geschachtelt werden.
QUELLCODE-INFOS:
~~~~~~~~~~~~~~~~
Jedes Programm hat sein eigenes Quellcode-Directory:
ray_source/
makefile
ray.h - alle globalen Definitionen
ray.c - Haupt-Modul des Ray-Tracers
val.c - momentane Farbintensität eines Objekts
hit.c - berechnet, ob ein Strahl auf ein Objekt trifft
tex.c - berechnet die Struktur eines Objekts
ext.c - behandelt die {,}-Erweiterungen
rnd.c - Zufallszahlen-Tabelle
mth.c - führt Vektor- und Matrix-Berechnungen aus
fil.c - Disk-I/O Routienen
int.c - findet Strahlen/Objekt-Schnittpunkte
cal.c - oberste Objekte-Berechnungen
ray2_source/
makefile
ray2.c - Quellcode des Post-Prozessors
display_source/
makefile
display.c - Quellcode des DISPLAY-Programms
Nun versucht mal Euer Glück ! Ich wünsche Euch jedenfalls
viel Vergnügen und much fun !!!